package negocios;

import java.util.List;

import negocios.excecoes.EntradaInvalidaException;
import negocios.excecoes.LocalizacaoException;
import negocios.excecoes.NaoEncontradoException;

/**
 * Interface que representa o Usuario do sistema I'm Here. Um usuario devera ter
 * opcoes de acesso aos seus dados pessoais, e acoes referentes aos seus amigos.
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 2.0
 */

public interface Usuario extends Comparable<Usuario> {
	/**
	 * Retorna o nome do Usuario
	 * 
	 * @return uma String representando o nome
	 */
	public String getNome();

	/**
	 * Retorna o login do Usuario
	 * 
	 * @return uma String representando o login
	 */
	public String getLogin();

	/**
	 * Retorna o email do Usuario
	 * 
	 * @return uma String representando o email
	 */
	public String getEmail();

	/**
	 * Retorna o telefone do Usuario
	 * 
	 * @return uma String representando o telefone
	 */
	public String getTelefone();

	/**
	 * Retorna a caixa de entrada do usuario.
	 * 
	 * @return a caixa postal do usuario
	 */
	public CaixaPostal getCaixaPostal();

	/**
	 * Retorna a lista de amigos do usuario
	 * 
	 * @return a lista de amigos do usuario
	 */
	public List<Relacionamento> amigos();

	/**
	 * Retorna o Localizador
	 * 
	 * @return o localizador
	 */
	public Localizador getLocalizador();

	/**
	 * Atualiza o metodo de localizacao do Usuario
	 * 
	 * @param loc
	 *            o novo Localizador
	 */
	public void setLocalizador(Localizador loc);

	/**
	 * Exclui um amigo da lista de contatos do usuario
	 * 
	 * @param amigo
	 *            o usuario amigo a excluir
	 * @throws NaoEncontradoException
	 *             caso este amigo nao seja encontrado
	 */
	public void excluirAmigo(Usuario amigo) throws NaoEncontradoException;

	/**
	 * Seta um novo nome para o usuario
	 * 
	 * @param nome
	 *            o novo nome do usuario
	 * @throws EntradaInvalidaException
	 *             caso o nome nao seja valido
	 */
	public void setNome(String nome) throws EntradaInvalidaException;

	/**
	 * Seta um novo telefone para o usuario, no formato DDDTELEFONE. Ex.:
	 * 8333884924
	 * 
	 * @param telefone
	 *            o telefone no formato especificado
	 * @throws EntradaInvalidaException
	 *             se o telefone passado como parametro nao for valido
	 */
	public void setTelefone(String telefone) throws EntradaInvalidaException;

	/**
	 * Seta um novo email, no formato email xxx@xxx...
	 * 
	 * @param email
	 *            o email no formato especificado
	 * @throws EntradaInvalidaException
	 *             se o email passado como parametro nao for valido
	 */
	public void setEmail(String email) throws EntradaInvalidaException;

	/**
	 * Seta uma nova senha para o usuario, a senha deve ter tamanho minimo de 6
	 * caracteres.
	 * 
	 * @param novaSenha
	 *            a senha nova
	 * @throws EntradaInvalidaException
	 *             se a senha nao seguir o especificado, ou se a senha antiga
	 *             nao for compativel
	 */
	public void setSenha(String novaSenha) throws EntradaInvalidaException;

	/**
	 * Retorna a localizacao atual do usuario.
	 * 
	 * @return a Localizacao do usuario
	 * @throws LocalizacaoException
	 *             caso a Localizacao nao possa ser obtida
	 */
	public Localizacao localizacao() throws LocalizacaoException;

	/**
	 * Adiciona um Usuario na lista de amigos do usuario
	 * 
	 * @param amigo
	 *            o usuario amigo a adicionar
	 * @throws EntradaInvalidaException
	 *             caso o usuario ja seja amigo desse usuario
	 */
	public void adicionaAmigo(Usuario amigo) throws EntradaInvalidaException;

	/**
	 * Adiciona um Usuario na lista de amigos do usuario
	 * 
	 * @param amigo
	 *            o usuario amigo a adicionar
	 * @param oculto
	 *            o modo de compartilhamento inicial
	 * @throws EntradaInvalidaException
	 *             caso o usuario ja seja amigo desse usuario
	 */
	public void adicionaAmigo(Usuario amigo, boolean oculto)
			throws EntradaInvalidaException;

	/**
	 * Retorna a senha do usuario
	 * 
	 * @return a senha do usuario
	 */
	public String getSenha();

	/**
	 * Seta o status do usuario como logado
	 */
	public void logar();

	/**
	 * Seta o status do usuario como deslogado
	 */
	public void deslogar();

	/**
	 * Responde se o usuario esta logado
	 * 
	 * @return true se o usuario estiver logado, false caso contrario
	 */
	public boolean isLogado();

	/**
	 * Responde se dois usuarios sao iguais
	 * 
	 * @param o
	 *            o objeto a comparar
	 * @return true se forem iguais (login iguais), false caso contrario
	 */
	public boolean equals(Object o);
}